パフォーマンス最適化
このページでは、LinuxベースのCODESYS Control SL製品をデバイスとアプリケーション用に設定して、可能な限り最高のパフォーマンスを実現する方法を紹介します。
システムの現在のステータスを確認および評価するために使用できるツールを提供します。
以下の手順をお勧めします。これらの手順は、指定された順序で実行してください。現在のステップが必要ほど最適化されていなければ、次のステップに進んでも意味がありません。
重要
各ステップの後、最後の変更が前のステップの最適化に悪影響を及ぼしていないことを確認します。
通常の負荷で望ましいパフォーマンスを達成した後、オプションで高負荷でのテストを実行できます。 stress-ng または iperf。
ハードウェアのチェック
コントローラーのプロセッサ コアには共有キャッシュを使用しないでください。
ターゲットデバイスにイーサネットベースのフィールドバスを使用している場合は、物理アダプターを使用してください。スイッチアーキテクチャは使用しないでください
Linuxのセットアップ
リアルタイム カーネルを使用します。
重要
Linux でのリアルタイム操作には、リアルタイム PREEMPT パッチを使用してください。低レイテンシーのカーネルを使用するだけでは不十分です。なぜなら、リアルタイムプロパティの確定性が保証されないからです
詳細については、以下を参照してください。
以下のシステム設定の多くは、PLCShell を使用してランタイムシステム経由で直接設定することも、ランタイムシステムの設定ファイルから直接設定することもできます。一部のシステム設定は、システムを再起動しても保持されません。設定ファイルに設定を入力すると、ランタイムシステムの起動時に設定が自動的に復元されます。対応する PLCShell コマンドを実行すると、それぞれのエントリも設定ファイルに追加されます
PLC シェルコマンド
設定ファイルエントリ
ファンクション
rt-get scaling_governor/kernelinfo/hyperthreading/throttling/napi <device>システム設定に関する情報を返します
例 3. 例rt-get scaling_governor使用可能なスケーリングガバナーを表示し、コアに設定されているスケーリングガバナーを返します
rt-set scaling_governor <cpu_index> <value>[CmpLinuxRTDiag] ScalingGovernor.CPU0=performance
特定のコアまたはすべてのコアのスケーリングガバナーを指定されたオプションに設定します
例 4. 例set scaling_governor all performancert-set hyperthreading <state>[CmpLinuxRTDiag] Hyperthreading=off
ハイパースレッディングのオン/オフを切り替えます
rt-set throttling <state>[CmpLinuxRTDiag] Throttling=off
スロットリングをオン/オフにします
rt-set napi <device> <state>[CmpLinuxRTDiag] Napi=eno1
ネットワークアダプタのスレッド NAPI を有効または無効にします
rt-clear-settingsすべて削除します
rt-set設定ファイルからの設定rt-marker-set <taskname> <threshold>[CmpLinuxRTDiag] TraceMarker.TaskName=MainTask TraceMarker.ThresholdUs=100 [SysTask] Linux.MeasureInterval=1
ジッターが指定された制限を超えたときに、指定されたタスクのカーネルトレースマーカーの書き込みを有効にします。
ランタイムが root ユーザーとして実行されている場合にのみ使用可能
rt-marker-disableカーネルトレースマーカーを無効にします
rt-marker-getカーネルトレースマーカーとジッター制限に設定されたタスク名を指定します
irq-list使用可能なすべての IRQ、その優先順位、およびシステム上のアフィニティを一覧表示します
irq-set-prio <no | device> <priority>[CmpLinuxInterrupt] Interrupt.1.Priority=51 Interrupt.1.Device=eno1
Sets the priority of interrupts specified either by number <no> or device <device> to the desired value
irq-set-affinity <no | device> <bitmask>[CmpLinuxInterrupt] Interrupt.1.Affinity=128 Interrupt.1.Device=eno1
Sets the core affinity of the interrupt specified either by number <no> or device <device> to the desired bitmask
irq-clear-settingsすべて削除します
irq sets設定ファイルからの設定リアルタイムでの要求には、RT プリエンプトカーネルを使用する必要があります (https://wiki.linuxfoundation.org/realtime/documentation/start) お使いの Linux システム用。Debian ディストリビューションと Ubuntu ディストリビューションの場合は、RT カーネルがパッケージとして用意されており、次のコマンドを使用して簡単にインストールできます
aptコマンド。これについての詳細は、お使いのディストリビューションのマニュアルを参照してください。Debian システムの場合
sudo apt-get install linux-image-rt-amd64を使う
uname -a例えば、どのカーネルを使っているかを確認するコマンド。
お使いのシステムで Windows マネージャや GUI/X サーバなどを使用しないでください。
これらのツールを使用すると、システムのリアルタイム機能に影響を及ぼし、IEC アプリケーションで高いジッターが発生する可能性があります。
テスト
「rt-tools」の使用:
「rt-tools」のインストール:
sudo apt install rt-tests「cyclictest」を開始します。
sudo cyclictest -p 99 -t -mの
man cyclictestコマンドでは、システムのより詳細な、または特定のパフォーマンス側面をより適切に測定するために使用できる、より多くのコマンド ライン オプションが表示されます。
で決まる値の有無 cyclictest ハードウェアによっては「良好」と見なすことができます。非常に強力なプロセッサー (Intel Core i7 など) を使用している場合は、最大で 1 桁の数字を小さくする必要があります。古い ARM プロセッサを使用している場合は、100 が適切な結果になる可能性があります
最適化オプション
重要
各設定または設定の組み合わせを変更したら、次のコマンドを実行する必要があります。 cyclictest 変更の有効性を検証するプログラム。
これらの設定は永続的ではないため、システムの起動または再起動後にリセットする必要があります。
注記
バージョン 4.21.0.0 以降では、 CODESYS 、これらの値のほとんどを直接出力する PLC Shell コマンドが用意されています。これを行うには、以下を実行します。 system-creatertreport コマンド。コマンドの詳細については、以下を実行してください system-creatertreport ?。
CPU 省エネモードを無効にします。
ハイパースレッディングを無効にします。
次のコマンドを使用してハイパースレッディングを無効にできます (例)。
echo off | sudo tee /sys/devices/system/cpu/smt/controlCPUの周波数スケーリングと切り替えをできるだけ無効にしてください。
たとえば、CPU 周波数の最小値と最大値を同じ (固定) 値に設定します。
Linux カーネルのリアルタイムスロットリングメカニズムを無効にしてください。これにより、システムにジッターが発生する可能性があります。
詳細については、以下を参照してください。 Linux の基礎:スケジューリング — RT スロットリング
次のコマンドを使用してリアルタイムスロットリングを無効にできます (例)。
echo -1 > /proc/sys/kernel/sched_rt_runtime_usスケジューリング/スケーリングガバナーを確認して変更してください。
使用されているスケジューリング/スケーリングガバナーを確認してください。
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
使用中のスケジューリング/スケーリングガバナーを変更 (as)
root/admin) からPerformance:echo "performance" > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor # set it for all available cores: echo "performance" > /sys/devices/system/cpu/cpu1/cpufreq/scaling_governor echo "performance" > /sys/devices/system/cpu/cpu2/cpufreq/scaling_governor echo "performance" > /sys/devices/system/cpu/cpu3/cpufreq/scaling_governor
スケーリングガバナーは、システムを起動するたびにリセットする必要があることに注意してください。カーネル設定を使って設定することもできます。
ザ・
intel_pstateカーネルドライバーは正しい設定をより困難にする可能性があります。そのため、以下を使用してください。cpufreq-infoコマンドを使用して設定を確認します。次のようなプログラムを使用することもできます
cpu-freq-utils。これにより Intel pstate ドライバーが動作しなくなる可能性があります。通常、これらのドライバーでは CPU 周波数を設定するには別の方法が必要です詳細については、以下を参照してください。 https://www.kernel.org/doc/Documentation/cpu-freq/governors.txt
無効
HyperVBIOS で (利用可能な場合)。
の設定 CODESYS ランタイムシステム
必要なリソース、必要なパフォーマンス、プロジェクトサイズの観点から、システムを最適化したいアプリケーションを大まかに説明するテストアプリケーションを作成します。
これを繰り返し行うことができます。最初に非常に大まかな近似を作成し、それを拡張して実際のアプリケーションにどんどん近づけます。
テスト
アプリケーションの実行中に、タスクの構成を確認します。を開きます。 タスクの構成 そして、 モニター タブ。

分。ジッタ (μs) / 最大ジッター (μs)
値は、「cycletest」プログラムによって決定された値にできるだけ近い必要があります。詳細はセクションで説明されています Linuxのセットアップ。
ジッターと遅延の詳細については、以下を参照してください。 ジッターとレイテンシーの定義
[監視] タブの詳細については、次を参照してください。 タブ: モニタリング
平均サイクル時間 (μs) / 最大サイクルタイム (μs) サイクルタイム (μs)
最大サイクルは、設定されたサイクル タイムに決して近づいてはなりません。これにより、システムに高負荷がかかるとすぐに問題が発生します。
サイクルタイムは常にできるだけ短くしてください。
最適化オプション
重要
各設定または設定の組み合わせを変更したら、次のコマンドを実行する必要があります。 cyclictest 変更の有効性を検証するプログラム。
長時間実行されるタスクを複数の小さなタスクに分割します。
実行中、最も優先度の高いタスクの最大サイクル タイムは、設定されたサイクル タイムに決して達してはなりません。これを回避できない場合は、設定されたサイクル タイムを増やして、一貫した実行時間を確保する必要があります。
フィールドバス システム (EtherCAT や PROFINET など) を開始する場合、開始サイクルにより CPU 負荷がわずかに高くなる可能性があります。この場合、アプリケーションの起動直後に CPU 負荷を監視することが合理的です。
次のオプションは変更できません CODESYS Virtual Control SLただし、ホスト上で構成する必要があります。
の値を設定します
DisableCpuDmaLatency1に:[SysCpuHandling] Linux.DisableCpuDmaLatency=1
これはランタイム バージョン 4.11.0.0 のデフォルト設定であることに注意してください。
ランタイムのバージョンを確認するには、 エクストラ → Linuxをアップデートする → システム → システム情報。
リアルタイムカーネルが実際に使用されていることを確認してください。
バージョン 4.11.0.0 では、PLC シェル コマンドを使用できます。
rt-get kernelinfoこれを確認するために。古いバージョンを使用している場合は、コマンドラインでこれを直接テストできます。
uname -aコマンド。リアルタイムカーネルを使用していない場合は、最適化を最初から開始する必要があります。
IEC アプリケーションの設定
このセクションでは、実際のアプリケーションについて説明します。
テスト
前のステップのテストを使用できます。 の設定 CODESYS ランタイムシステム IEC アプリケーションをテストするため。
最適化オプション
重要
各設定または設定の組み合わせを変更した後、「cyclictest」プログラムを実行して変更の有効性を確認する必要があります。
使用できます マルチコア の特徴 CODESYS。
タスクの正しい優先順位を決定します。重要なタスクは優先順位を高くする必要があります。
表 6. IEC タスクの優先順位と Linux スレッドの優先順位のマッピング:IEC タスクの優先順位
ランタイム優先度
Linuxの優先順位
--
0
88 (SCHED_FIFO)
--
31
57 (SCHED_FIFO)
0 (最も高いリアルタイム優先度)
32
56 (SCHED_FIFO)
15 (リアルタイム優先度が最低)
47
41 (SCHED_FIFO)
16 (リアルタイム優先ではない)
48
0 (SCHED_OTHER)
31 (リアルタイム優先ではない)
63
0 (SCHED_OTHER)
--
64
0 (SCHED_OTHER)
--
255
(SCHEDLE)
注記
従来の Linux システムでは、ほとんどの割り込み (IRQ) とカーネルワーカーは Linux の優先度が 50 です。それを上回る優先順位 (高負荷) を使用すると、システム機能 (ネットワーク/ストレージ) が期待どおりに動作しなくなる可能性があります
タスクの優先度は、それぞれのタスク設定で設定できます。

ここで説明したすべての手順を実行しても望ましいパフォーマンスが得られない場合は、次のセクションを参照してください。
フィールドバス固有の情報
テスト
チェックしてください
Send Time/Recv TimeEtherCAT ステータス ページの値。Intel Core i7 プロセッサを搭載した x64 CPU と適切なアダプタでは、10µs 未満になるはずです。
チップが統合された ARM プロセッサでは、最大 50µs 以上の時間がかかります。

チェックしてください
Send Time/Recv TimePROFINET ステータス ページの値。Intel Core i7 プロセッサを搭載した x64 CPU と適切なアダプタでは、10µs 未満になるはずです。
チップが統合された ARM プロセッサでは、最大 50µs 以上の時間がかかります。

最適化オプション
優先順位と必要な IRQ を並べ替えるには、PLC シェル コマンドを使用できます。
irq-listそしてirq-set-prio。これらのコマンドは、IEC 優先順位ではなく、通常の Linux 優先順位を使用します。
この最適化は次の場合には実行できません。 CODESYS Virtual Control SL、むしろホストシステム上で。
デバイスには別のネットワーク アダプターを使用してください。
詳細については、以下を参照してください。
[専門家向け] – 追加のツールとトピック
このセクションで説明するツールとオプションは上級ユーザー向けです。実行すべきアクションは特定のシステムに大きく依存するため、独立した調査が必要です。そのため、特定のソリューションを提供することはできません。
KernelShark / カーネル トレース
パフォーマンスの問題の原因がスケジューリングに関係していることがわかった場合は、このプログラムを選択してください。「カーネルトレース」を使用すると、タスクが別のタスク、別のサービス、または割り込みによって中断されていないかどうかを確認できます
trace-cmd record -p functionKernelShark を使用して、生成された
trace.datファイル。
一般に、スケジュールの問題は次の 2 つのカテゴリに分類できます。
スーパーセッション/プリエンプション
実行を妨げる割り込みやタスクが不要な場合は、割り込みを禁止してください。
自分のタスクの優先度を上げるか、他のタスクの優先度を下げます。
別の CPU コアに切り替えます。
重要
前の章で説明したプログラムを使用して、変更の有効性を確認してください。
実行時間
以下の「カーネル関数トレース」を参照してください
カーネル関数トレース
コードの処理時間が長すぎる場合は、このツールを使用して問題を見つけることができます。
実行時間が長すぎる関数が独自のコードにある場合は、それを最適化する必要があります。
実行時間が長すぎる関数がカーネル内にある場合は、別のカーネル関数を使用して目的の機能を実現できます。あるいは、実行時間を短縮するために、構成パラメーターをカーネルドライバーに渡すこともできます。
これらのオプションのいずれも問題を解決できない場合は、おそらくより強力なハードウェアを使用する必要があります。
次の点を参考にして、パフォーマンス目標を達成するための適切な手段がリストに含まれているかどうかを確認してください。
PREEMPT_FULL
isolcpu
rcu_nocbs
rcu_nocb_poll
ソフトロックアップなし
irqbalance の無効化
kernel.sched_rt_runtime_us